Статистический анализ в Python
Приветствую вас на канале ТУЧ!
Сегодня мы немного коснемся теоретического материала из курса Теории Вероятностей и Статистики. Да, я понимаю, что это может и не пригодится вам, если вы хотите быть чистым разработчиком на python, однако мне, как будущему аналитику Яндекса, желательно повторить все способы рассмотрения основных метрик, завязанных на статистическом анализе.
Данная статья будет полезна даже тем, кто не особо знаком со статистическим анализом, так как я лично попытаюсь объяснить своим преподавательским ртом каждую метрику, которую мы затронем :)
Статистика - это не просто сухие цифры и факты. На этом языке не могут общаться люди, но могут говорить данные. С помощью статистики можно делать прогнозы, побеждать в лотерее, выявлять вирусы, или же просто удобно собирать информацию.
Сегодня мы изучим две отдельные области статистики:
Описательная статистика помогает нам систематизировать данные, выделять основные характеристики и делать выводы на основе них. Это как путеводитель в мире цифровой информации.
Как я представляю Описательную статистику |
Данная область науки занимается методами преобразования сырых данных в значимую информацию. Описательную статистику можно выполнять с помощью графиков, таблиц или статистических метрик. Однако наиболее популярным способом является использование статистических метрик, на которых мы, собственно, и сосредоточимся.
Когда я говорю о сырых данных, я имею ввиду данные, к которым я вообще никак не прикасался. Давайте рассмотрим пример, который можно взять, ну, допустим, из официального репозитория библиотеки seaborn.
import pandas as pd
import numpy as np
import seaborn as sns
tips = sns.load_dataset('tips')
tips.head()
запускаем всеми известные библиотеки, и скачиваем из интернета (а может они предустановлены? Не знаю) с помощью метода .load_dataset() таблицу tips. Выглядит она примерно так:
Таблица tips |
Какие же метрики мы сегодня будем рассматривать?
Однажды я решил поспорить с гениями Слейновской Теократии, Великими Бóтанами нашего времени. Спор был очень простой - я должен был назвать самую тяжелую в мире ложь, в которую сами Ботаны бы поверили.
И я сказал:
Определение среднего значения и математического ожидания - Одно и то же
Спустя несколько секунд в меня полетели сначала книги, а потом уже слова о том, что я неправ.
Давайте решим простую задачку, чтобы разобраться, в чём же подвох.
У вас есть 2 игральные кости. Найдите среднее арифметическое суммы чисел, а также найдите Мат. ожидание такой суммы.
Возьмем формулу среднего арифметического:
Значения одинаковые! Тогда в чем же подвох? Почему бы среднее арифметическое не называть просто Мат. ожиданием и всё...
Чтобы увидеть различия этих двух понятий, посмотрите внимательно на формулы выше. Чувствуете разницу?
Ну что ж, поэтому в нашей реальности, когда мы говорим о среднем значении, мы больше подразумеваем математическое ожидание (там, где это возможно).
Среднее - это способ получить одиночное значение, представляющее наиболее часто встречающееся значение в данных. Среднее можно вычислить, сложив все существующие значения в данных и разделив их на количество значений. В Python же это можно сделать следующим образом:
round(tips['tip'].mean(), 3) # 2.998
Медиана - это значение, находящееся посередине данных, когда они упорядочены. Медиана предпочтительна, когда данные смещены (имеют выбросы), потому что она может представлять центр данных, минимизируя влияние выбросов. Медиану можно вычислить в Python следующим образом:
tips['tip'].median() # 2.9
Мода - это значение с наибольшей частотой в данных. Данные могут иметь одну моду (унимодальные), несколько мод (мультимодальные) или вовсе не иметь моды (если нет повторяющихся значений). В Python это можно сделать так:
tips['day'].mode() # 'Sat' - В субботу чаще всего приходят в кафе
Диапазон - это разница между наибольшим (максимальным) и наименьшим (минимальным) значениями данных. Это простейшая мера разброса, потому что использует только два аспекта данных. Это можно посчитать в Python следующим образом:
tips['tip'].max() - tips['tip'].min() # 9.0
Дисперсия - это измерение разброса данных, которое показывает, насколько данные распределены относительно среднего значения. Для вычисления дисперсии мы возводим в квадрат разницы каждого значения от среднего и делим это на количество значений данных. Поскольку обычно мы работаем с выборками данных, а не с полными популяциями, мы вычитаем единицу из количества значений данных (Не знаю даже почему, но теоретическое обоснование существует и оно долгое). Уравнение для вычисления дисперсии представлено на изображении ниже.
Давайте попробуем вычислить дисперсию данных с использованием Python:
round(tips['tip'].var(), 3) # 1.914
Вычисленная дисперсия может предполагать высокий разброс в наших данных, но для более точной оценки разброса данных часто используется стандартное отклонение.
Стандартное отклонение - наиболее распространенный способ измерения разброса данных, и оно вычисляется как квадратный корень из дисперсии.
Разница между дисперсией и стандартным отклонением заключается в информации, которую они предоставляют. Значение дисперсии указывает только на то, насколько разбросаны наши значения относительно среднего, и единицы измерения дисперсии отличаются от исходных значений, поскольку мы возвели исходные значения в квадрат. Однако значение стандартного отклонения имеет те же единицы измерения, что и исходные данные, что позволяет использовать его напрямую для измерения разброса данных.
Давайте попробуем вычислить стандартное отклонение с помощью следующего кода:
round(tips['tip'].std(), 3) # 1.384
Одним из наиболее распространенных применений стандартного отклонения является оценка интервала данных. Мы можем оценить интервал данных, используя правило эмпирического распределения или правило 68–95–99,7. Правило эмпирического распределения утверждает, что 68% данных оцениваются в пределах среднего значения ± одно стандартное отклонение (STD), 95% данных в пределах среднего значения ± два STD и 99,7% данных в пределах среднего значения ± три STD. За пределами этого интервала можно считать значения выбросами.
То есть, если рассуждать логически, давайте посмотрим, есть ли такие данные среди выборки, которые не попадают в диапазон {Mean+-3STD}. Интересно...
Давайте это выясним!!!
Edge_left=round(tips['tip'].mean()-3*tips['tip'].std(),3)
Edge_right=round(tips['tip'].mean()+3*tips['tip'].std(),3)
print(f"По правилу 3х Отклонений, те чаевые, которые находятся вне диапазона [{Edge_left} - {Edge_right}] - Это выбросы")
tips[(tips['tip']>Edge_right) | (tips['tip']<Edge_left)]
2.998, Эти отличаются более чем в 3 раза, и их наверное даже не стоит учитывать. ВАУ!Инферентная статистика - это раздел, который обобщает информацию о популяции на основе данных выборки. Инферентная статистика используется потому, что часто невозможно получить данные по всей популяции, и нам приходится делать выводы на основе выборки данных. Например, представим, что нам нужно понять мнение людей в Индонезии о искусственном интеллекте (ИИ). Однако исследование займет слишком много времени, если опрашивать каждого человека в популяции Индонезии. Поэтому мы используем выборочные данные, представляющие популяцию, и делаем выводы о мнении населения Индонезии о ИИ.